import { h, render, ComponentInternalInstance } from 'vue';

export class RenderComponents {

    constructor() {

    }
    /**
     * 创建组件实例对象
     * 返回的实例和调用 getCurrentComponent() 返回的一致
     * @param {*} Component
     * @param props
     * @param children
     * @param {*} symbolKey 组件时的唯一symbol值
     */
    public createComponent(Component: any, props: any, children: any, symbolKey: symbol): ComponentInternalInstance | null {
        const vNode = h(Component, { ...props }, children);

        const container = document.createElement('div');

        // @ts-ignore
        vNode[symbolKey] = container;

        render(vNode, container);

        return vNode.component;
    }

    /**
     * 销毁组件实例对象
     * @param {*} ComponentInstance 通过createComponent方法得到的组件实例对象
     * @param {*} symbolKey 创建组件时的symbol值
     */
    public unmountComponent(ComponentInstance: any, symbolKey: symbol): void {
        // 移除组件节点，render函数的第一个传null，表示为移除动作，会执行unmount方法
        render(null, ComponentInstance.vnode[symbolKey]);
    }
}
